// 日志记录函数
function logMessage(type, message, error = null) {
  const logEntry = {
    timestamp: new Date().toISOString(),
    type: type,
    message: message,
    error: error ? error.message : null
  };
  console.log(`[${logEntry.timestamp}] [${type}] ${message}`, error || '');
  
  // 保存日志到storage
  chrome.storage.local.get(['logs'], (result) => {
    const logs = result.logs || [];
    logs.push(logEntry);
    // 只保留最近1000条日志
    if (logs.length > 1000) {
      logs.shift();
    }
    chrome.storage.local.set({ logs: logs });
  });
}

// 检测下载工具安装状态的基础函数
async function detectDownloader(protocol, timeoutMs = 300) {
  try {
    const iframe = document.createElement('iframe');
    iframe.style.display = 'none';
    document.body.appendChild(iframe);
    
    return await new Promise((resolve) => {
      const timeoutId = setTimeout(() => {
        logMessage('info', `${protocol} 检测超时`);
        cleanup();
        resolve(false);
      }, timeoutMs);

      const blurHandler = () => {
        logMessage('info', `${protocol} 检测成功`);
        cleanup();
        resolve(true);
      };

      const cleanup = () => {
        clearTimeout(timeoutId);
        window.removeEventListener('blur', blurHandler);
        if (document.body.contains(iframe)) {
          document.body.removeChild(iframe);
        }
      };

      window.addEventListener('blur', blurHandler, { once: true });
      iframe.contentWindow.location = protocol;
    });
  } catch (error) {
    logMessage('error', `检测 ${protocol} 时发生错误`, error);
    return false;
  }
}

// 检测IDM是否安装
async function detectIDM() {
  return await detectDownloader('idm://detect');
}

// 检测迅雷是否安装
async function detectThunder() {
  return await detectDownloader('thunder://');
}

// 默认配置
const DEFAULT_CONFIG = {
  defaultDownloader: 'chrome', // 'chrome', 'idm', 'thunder'
  showPopupOnDownload: true,
  rememberLastPath: true,
  lastSavePath: '',
  fileTypeFilters: [], // 例如 ['mp3', 'mp4', 'zip']
  downloadHistory: [],
  maxHistoryItems: 100
};

// 加载配置
async function loadConfig() {
  return new Promise((resolve) => {
    chrome.storage.sync.get(['config'], (result) => {
      if (chrome.runtime.lastError) {
        logMessage('error', '加载配置失败', chrome.runtime.lastError);
        resolve(DEFAULT_CONFIG);
      } else {
        const config = result.config || {};
        resolve({...DEFAULT_CONFIG, ...config});
      }
    });
  });
}

// 保存配置
async function saveConfig(config) {
  return new Promise((resolve, reject) => {
    chrome.storage.sync.set({ config }, () => {
      if (chrome.runtime.lastError) {
        logMessage('error', '保存配置失败', chrome.runtime.lastError);
        reject(chrome.runtime.lastError);
      } else {
        logMessage('info', '配置已保存');
        resolve();
      }
    });
  });
}

// 添加下载历史记录
async function addDownloadHistory(downloadItem) {
  try {
    const config = await loadConfig();
    const history = config.downloadHistory || [];
    
    // 添加新的下载记录
    history.unshift({
      id: downloadItem.id,
      url: downloadItem.url,
      filename: downloadItem.filename,
      fileSize: downloadItem.fileSize,
      startTime: new Date().toISOString(),
      downloader: config.defaultDownloader
    });
    
    // 限制历史记录数量
    if (history.length > config.maxHistoryItems) {
      history.pop();
    }
    
    config.downloadHistory = history;
    await saveConfig(config);
  } catch (error) {
    logMessage('error', '添加下载历史记录失败', error);
  }
}

// 检查URL安全性
async function checkUrlSafety(url) {
  // 这里可以集成Google Safe Browsing API或其他安全检查服务
  // 简单实现：检查是否是HTTPS
  const isHttps = url.startsWith('https://');
  if (!isHttps) {
    logMessage('warning', `非HTTPS下载URL: ${url}`);
  }
  return { safe: true, warning: !isHttps ? '非HTTPS链接可能不安全' : null };
}

// 下载事件处理
chrome.downloads.onCreated.addListener(async (downloadItem) => {
  try {
    logMessage('info', `检测到新下载: ${downloadItem.filename}`);
    
    // 检查URL安全性
    const safetyCheck = await checkUrlSafety(downloadItem.url);
    
    // 检测下载工具安装状态
    const [hasIDM, hasThunder, config] = await Promise.all([
      detectIDM(),
      detectThunder(),
      loadConfig()
    ]);
    
    // 准备下载信息
    const downloadInfo = {
      id: downloadItem.id,
      url: downloadItem.url,
      filename: downloadItem.filename,
      savePath: downloadItem.finalUrl ? downloadItem.finalUrl.split('/').pop() : '',
      size: downloadItem.fileSize,
      state: downloadItem.state,
      hasIDM,
      hasThunder,
      safety: safetyCheck,
      timestamp: new Date().toISOString(),
      config: config
    };

    // 添加到下载历史
    addDownloadHistory(downloadItem);

    // 存储下载信息到session storage供popup使用
    chrome.storage.session.set({ downloadInfo }, () => {
      if (chrome.runtime.lastError) {
        logMessage('error', '存储下载信息失败', chrome.runtime.lastError);
      } else if (config.showPopupOnDownload) {
        // 触发popup显示
        chrome.action.setBadgeText({ text: '↓' });
        chrome.action.setBadgeBackgroundColor({ color: '#4CAF50' });
      }
    });
    
    // 如果配置了默认下载器且不是Chrome，可以自动调用相应下载器
    if (!config.showPopupOnDownload && config.defaultDownloader !== 'chrome') {
      // 这里可以实现自动调用默认下载器的逻辑
      logMessage('info', `使用默认下载器 ${config.defaultDownloader} 下载`);
    }
  } catch (error) {
    logMessage('error', '处理下载事件时发生错误', error);
  }
});

// 下载状态变化事件处理
chrome.downloads.onChanged.addListener((delta) => {
  try {
    if (delta.state) {
      logMessage('info', `下载状态变化: ${delta.id} -> ${delta.state.current}`);
      
      if (delta.state.current === 'complete') {
        // 下载完成，清除badge
        chrome.action.setBadgeText({ text: '' });
      } else if (delta.state.current === 'interrupted') {
        // 下载中断
        chrome.action.setBadgeText({ text: '!' });
        chrome.action.setBadgeBackgroundColor({ color: '#F44336' });
        
        // 获取中断原因
        if (delta.error) {
          logMessage('error', `下载中断: ${delta.error.current}`, { message: delta.error.current });
        }
      }
    }
  } catch (error) {
    logMessage('error', '处理下载状态变化事件时发生错误', error);
  }
});

// 扩展安装或更新时初始化
chrome.runtime.onInstalled.addListener(async (details) => {
  try {
    if (details.reason === 'install') {
      logMessage('info', '扩展已安装');
      // 初始化配置
      await saveConfig(DEFAULT_CONFIG);
    } else if (details.reason === 'update') {
      logMessage('info', `扩展已更新: ${details.previousVersion} -> ${chrome.runtime.getManifest().version}`);
      // 可以在这里处理版本升级逻辑
    }
  } catch (error) {
    logMessage('error', '扩展初始化失败', error);
  }
});